package com.zhisheng.web17.demos.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * 创建者： 智晟全哥
 */

@Component
@Aspect
public class MyAop {

    // 直接写通知
    // public * com.zhisheng.web17.demos.service.impl.UserServiceImpl.*(..)) 是切点表达式
    //@Around("execution(public * com.zhisheng.web17.demos.service.impl.UserServiceImpl.*(..))")
    //@Around("@annotation(com.zhisheng.web17.demos.aop.MyBj)")

    @Around("pt()")
    public Object doAop(ProceedingJoinPoint pjp) throws Throwable {
        // 写自己增强的逻辑
        Object[] args = pjp.getArgs();
        String methodName = pjp.getSignature().getName();
        String className = pjp.getSignature().getDeclaringTypeName();
        System.out.println("环绕通知在业务层的"+className+"类下的"+methodName+"方法执行前的操作....参数为:"+ Arrays.toString(args));
        // 让目标方法执行
        Object o = pjp.proceed();
        // 对目标方法返回的结果进行处理
        System.out.println("环绕通知在业务层的"+className+"类下的"+methodName+"方法执行后的结果是:"+o);
        return o;
    }

    // 单独定义一个切点(本质上就是一个方法,这个方法的作用就是专门承载切点表达式的,以便于通知可以重复利用某个切点表达式而已)
    //@Pointcut("@annotation(com.zhisheng.web17.demos.aop.MyBj)")
    @Pointcut("execution(public * com.zhisheng.web17.demos.service.impl.UserServiceImpl.*(..))")
    public void pt(){}
}
